﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Net;
using System.Collections;
using System.Windows.Forms;
using System.IO;

namespace Example
{
	/// <summary>
	/// Clase que gestiona la lógica del Login y su ventana
	/// </summary>
	public partial class MainWindow : Window
	{
        /// <summary>
        /// Puerto por defecto
        /// </summary>
        String puertoDefecto = "4444";

        /// <summary>
        /// Array de bytes donde guardaremos el avatar
        /// </summary>
        Byte[] avatar;

        /// <summary>
        /// Constructur vacio de la clase Login
        /// </summary>
		public MainWindow()
		{
			this.InitializeComponent();
            this.ipBox.Text = this.LocalIPAddress();
            this.puertoBox.Text = puertoDefecto;
		}

        /// <summary>
        /// Método que obtiene la ip de nuestra máquina (Para el uso de sockets)
        /// </summary>
        /*Metodo para capturar la Ip*/
        private string LocalIPAddress()
        {
            IPHostEntry host;
            string localIP = "";
            host = Dns.GetHostEntry(Dns.GetHostName());
            foreach (IPAddress ip in host.AddressList)
            {
                if (ip.AddressFamily.ToString() == "InterNetwork")
                {
                    //Mediante este if descartamos las Ips erroneas
                    /*if (ip.ToString().Substring(0, 3) != "192")
                    {
                        localIP = ip.ToString();
                    }*/
                    //Descomentar en casa y comentar el If, ya que puede dar problemas
                    localIP = ip.ToString();
                }
            }
            return localIP;
        }

        /// <summary>
        /// Método que gestiona la acción de cerrar la ventana, cierra el entorno entero
        /// </summary>
        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            Environment.Exit(0);
        }

        /// <summary>
        /// Método para transformar una Image en BitmapImage
        /// </summary>
        /// <param name="Imagen">La Image a transformar</param>
        /// <returns>Devuelve la imagen transformada en BitmapImage</returns>
        public BitmapImage FromStream(System.Drawing.Image Imagen)
        {
            BitmapImage bmp = new BitmapImage();
            var image = Imagen;
            bmp.BeginInit();
            MemoryStream memoryStream = new MemoryStream();
            image.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Bmp);
            avatar = memoryStream.ToArray();
            memoryStream.Seek(0, System.IO.SeekOrigin.Begin);
            bmp.StreamSource = memoryStream;
            bmp.EndInit();
            return bmp;
        }

        /// <summary>
        /// Evento al hacer click en el despliegue de la ventana (Depliega el registro)
        /// </summary>
        private void button1_Click_1(object sender, RoutedEventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            dlg.ShowDialog();
            image1.Source = FromStream(System.Drawing.Image.FromFile(@dlg.FileName));

        }

        /// <summary>
        /// Evento al hacer click en el botón de Ok de login
        /// </summary>
        private void okLoginBtn_Click_1(object sender, RoutedEventArgs e)
        {
            
            Login log = new Login(this.userBox.Text, this.passwordBox.Password, this.ipBox.Text);



            if (log.hacerLogin())
            {
                SalonChat salonChat = new SalonChat(this.ipBox.Text, this.puertoBox.Text, log.getNombre());
                this.Hide();//Ocultamos el login
                salonChat.Show();//Mostramos la ventana

            }
            else
            {
                /* Login incorrecto */

                SolidColorBrush color = new SolidColorBrush(Colors.Red);
                passLbl.Foreground = color;
                passwordBox.Clear();
            }

        }

        /// <summary>
        /// Evento al hacer click en el botón de Registro, se comprueban campos correctos (Se iluminan los fallidos)
        /// </summary>
        private void okRegBtn_Click_1(object sender, RoutedEventArgs e)
        {

            SolidColorBrush color1 = new SolidColorBrush(Colors.Black);
            userRegLbl.Foreground = color1;
            emailRegLbl.Foreground = color1;
            passRegLbl.Foreground = color1;
            rePassRegLbl.Foreground = color1;

            /* Comprobamos que los campos obligatorios no esten vacios */
            if (userRegBox.Text == "" || emailBox.Text == "" || passRegBox.Password == "" || repassRegBox.Password == "")
            {
                if (userRegBox.Text == "")
                {
                    SolidColorBrush color = new SolidColorBrush(Colors.Red);
                    userRegLbl.Foreground = color;
                }
                if (emailBox.Text == "")
                {
                    SolidColorBrush color = new SolidColorBrush(Colors.Red);
                    emailRegLbl.Foreground = color;
                }
                if (passRegBox.Password == "")
                {
                    SolidColorBrush color = new SolidColorBrush(Colors.Red);
                    passRegLbl.Foreground = color;
                }
                if (repassRegBox.Password == "")
                {
                    SolidColorBrush color = new SolidColorBrush(Colors.Red);
                    rePassRegLbl.Foreground = color;
                }
                

                ErrorRegTextBlock.Text = "Error: Los campos marcados con * son obligatorios";
                ErrorRegTextBlock.Visibility = System.Windows.Visibility.Visible;
            }
            else
            {


                if (this.passRegBox.Password.Equals(this.repassRegBox.Password))
                {
                    
                    Usuario user = new Usuario(this.userRegBox.Text, this.passRegBox.Password, this.avatar, this.emailBox.Text, "Desctipcion");
                    
                    if (user.registro())
                    {
                        ErrorRegTextBlock.Visibility = System.Windows.Visibility.Hidden;
                        userRegBox.Clear();
                        passRegBox.Clear();
                        emailBox.Clear();
                        repassRegBox.Clear();
                        Ventana vent = new Ventana(1);
                        vent.Show();

                    }
                    else
                    {
                        ErrorRegTextBlock.Text = "Error: Ya existe un usuario con ese nombre. Elige otro.";
                        ErrorRegTextBlock.Visibility = System.Windows.Visibility.Visible;
                        SolidColorBrush color = new SolidColorBrush(Colors.Red);
                        userRegLbl.Foreground = color;
                    }
                    
                }
                else
                {
                    ErrorRegTextBlock.Text = "Error: las contraseñas introducidas no coinciden";
                    ErrorRegTextBlock.Visibility = System.Windows.Visibility.Visible;
                    SolidColorBrush color = new SolidColorBrush(Colors.Red);
                    rePassRegLbl.Foreground = color;
                    passRegLbl.Foreground = color;
                    this.passRegBox.Clear();
                    this.repassRegBox.Clear();

                }

            }
        }

        /// <summary>
        /// Evento al hacer click en el botón de Limpiar Registro, limpia todos los campos y los pone a null
        /// </summary>
        private void cleanRegBtn_Click_1(object sender, RoutedEventArgs e)
        {
            this.userRegBox.Clear();
            this.passRegBox.Clear();
            this.repassRegBox.Clear();
            this.emailBox.Clear();
            BitmapImage bi = new BitmapImage();
            bi.BeginInit();
            bi.UriSource = new Uri(@"Images/usuario_default.jpg", UriKind.Relative);
            bi.EndInit();
            this.image1.Source = bi;
            this.avatar = null;
            ErrorRegTextBlock.Visibility = System.Windows.Visibility.Hidden;
        }


        /// <summary>
        /// Evento al hacer click en el botón que aparezca el registro de nuevo (Despliega el registro)
        /// </summary>
        private void button2_Click(object sender, RoutedEventArgs e)
        {
            RegGrid.Visibility = System.Windows.Visibility.Visible;
            button2.Visibility = System.Windows.Visibility.Hidden;
            button3.Visibility = System.Windows.Visibility.Visible;
        }

        /// <summary>
        /// Evento al hacer click en el botón que oculta el registro de nuevo (Pliega el registro)
        /// </summary>
        private void button3_Click(object sender, RoutedEventArgs e)
        {
            RegGrid.Visibility = System.Windows.Visibility.Hidden;
            button2.Visibility = System.Windows.Visibility.Visible;
            button3.Visibility = System.Windows.Visibility.Hidden;
        }


        
    }

}